home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MOTOROLA / 6805V107 / TEST.SRC < prev    next >
Text File  |  1995-05-03  |  12KB  |  424 lines

  1.         title   'Keyless Lock - AN863'
  2. * Motorola Evaluation Program: MC1468705F2  Keyless Lock
  3. * See Motorola application note AN-863
  4. *
  5. * This was typed in from a Motorola application-note, as
  6. *  a simple demonstration of the software package.
  7. * It does not exhibit every capability of the Assembler
  8. *  (eg complex operand expressions), but it will serve
  9. *  as a start.
  10. *
  11. * If you want to emulate this code, be sure to select
  12. *  "68705P3" emulation mode.
  13. *
  14.         include '68705f2.asm'   Standard definitions
  15.         ORG     $40
  16. *
  17. CTRL    FCB     0
  18. CODE    RMB     8       ENTRY CODE LOCATION
  19. NCODE   RMB     8       ENTERED CODE LOCATION
  20. VERI    RMB     8       VERIFY CODE LOCATION
  21. TEMPX   FCB     0       TEMPORARY REG FOR X
  22. TEMP    FCB     0       ANOTHER TEMP REG
  23. TEMP2   FCB     0       TIME COUNTER (UPPER)
  24. TEMP1   FCB     0       TIME COUNTER (LOWER)
  25. TEMPA1  FCB     0       TIME DELAY REGISTER
  26. TEMPA   FCB     0
  27. VALID1  FCB     0
  28. VALID2  FCB     0
  29. TEMP3   FCB     0
  30. *
  31. *
  32. BLANK   EQU     $00     BLANK CHARACTER TO LCD
  33. DASH    EQU     $20     DASH
  34. *
  35. ****************************************************
  36. *
  37. *       Equates, etc., to resolve references to code
  38. *
  39. ****************************************************
  40. *
  41.         ORG     $B9
  42. VERIFY  MSG     'VERIFY'
  43. *
  44.         ORG     $C1
  45. ERROR   MSG     'ERROR'
  46. *
  47.         ORG     $C9
  48. OPEN1   MSG     'OPEN'
  49. *
  50.         ORG     $D1
  51. CHG     MSG     'CHANGE'
  52. *
  53. *
  54. ****************************************************
  55. *                                                  *
  56. * NB Changed code here!!                           *
  57. * The original definitions follow: these pointed   *
  58. *  to a firmware debugger (not part of this code)  *
  59. * To make this code run (in emulation), they are   *
  60. *  replaced by EQU's to the code start.            *
  61. *                                                  *
  62. *RESET   EQU     $F8    Restart firmeware debugger *
  63. *MONIT   EQU     $179   SWI instruction: trap      *
  64. *                                                  *
  65. ****************************************************
  66. *
  67.         eject
  68. ****************************************************
  69. *
  70.         ORG     $343
  71. *
  72. *               INITIALISATION GOES HERE
  73. *
  74. RESET   EQU     $
  75. MONIT   EQU     $
  76. LOCK    LDA     #$F0
  77.         STA     PORTA+DDR
  78.         CLR     PORTB           CLEAR PORTB
  79.         CLR     CTRL
  80.         CLRA
  81.         COMA                    GET FF
  82.         STA     PORTB+DDR       SET PORTB DDR TO OUT
  83. BEGIN   JSR     CLEAR
  84. *
  85. *
  86.         STOP                    STOP PROCESSOR AND W
  87. BGIN1   JSR     CLEAR           CLEAR DISPLAY
  88.         CLI
  89. *
  90. *       GET NUMBER
  91. *
  92.         LDX     #NCODE          GET RAM STORAGE SPOT
  93.         BSR     GET8            GET 8 NUMBERS
  94. *
  95. *       NOW THAT WE HAVE THE EIGHT-DIGIT NUMBER COMP
  96. *       THE VALID ENTRY CODE AND THE CHANGE CODE. IF
  97. *       NO MATCH INCREMENT ALARM COUNTER.
  98. *
  99.         LDX     #$08            GET COUNT
  100. MOR2    LDA     NCODE-1,X       GET FIRST/N NUMBER
  101.         CMP     CHG-1,X         IS IT THE CHANGE COD
  102.         BNE     MORR            IF Z=0 NOT EQUAL
  103.         DECX                    DECREMENT COUNTER
  104.         BNE     MOR2            DO MORE IF NO
  105.         BRA     VERI1
  106. *
  107. *
  108.  
  109. MORR    LDX     #CODE           GET FIRST LOCATION
  110.         JSR     BLCMP           COMPARE THEM
  111.         INCA                    CHECK FOR EQUAL
  112.         BNE     OPEN            IF NOT 0 THEN EQUAL
  113.         BRA     ALARM1
  114. *
  115. *
  116. *       CHANGE ENTRY CODE SECTION WITH VERIFY
  117. *
  118.  
  119. VERI1   JSR     CLEAR           CLEAR DISPLAY
  120. VERI2   LDX     #NCODE          GET RAM LOCATION
  121.         BSR     GET8            GET NUMBER
  122. *
  123. *       SEND THE WORD VERIFY HERE
  124. *
  125.         LDX     #$08            GET COUNTER
  126. LOOP    LDA     VERIFY-1,X
  127.         JSR     DSPLY
  128.         DECX
  129.         BNE     LOOP
  130. *
  131. *
  132.         LDX     #VERI           GET RAM LOCATION
  133.         BSR     GET8            GET NUMBER
  134. *
  135. *       COMPARE VERIFY
  136. *
  137.         LDX     #NCODE          GET FIRST NUMBER
  138.         JSR     BLCMP           COMPARE
  139.         INCA                    CHECK FOR FF
  140.         BEQ     CNT2            IF ZERO THEN ERROR
  141. *
  142. *       VERIFY OK
  143. *
  144.         LDX     #$08
  145. MOR6    LDA     VERI-1,X        GET START OF CODE
  146.         STA     CODE-1,X        STORE IT
  147.         DECX
  148.         BNE     MOR6            IF NOT DONE DO MOR6
  149.         JMP     BEGIN           GOTO START OF PROGRA
  150. *
  151. *       IF IT GETS HERE THERE HAS BEEN A VERIFY ERRO
  152. *       SEND THE WORD ERROR TO THE LCD
  153. *
  154.  
  155. CNT2    LDX     #$08            GET COUNTER
  156. LOOP2   LDA     ERROR-1,X
  157.         JSR     DSPLY
  158.         DECX
  159.         BNE     LOOP2
  160.         BRA     VERI2
  161. *
  162. *       THIS IS THE OPEN LOCK PART
  163. *
  164.  
  165. OPEN    LDX     #$08            GET COUNTER
  166. LOO3    LDA     OPEN1-1,X
  167.         JSR     DSPLY
  168.         DECX    
  169.         BNE     LOO3
  170. *
  171.         BRCLR   7,CTRL,NXT      ALARM BIT SET?
  172.         BCLR    7,CTRL          RESET IT IF YES
  173.         BCLR    2,PORTB         CLEAR ALARM BIT TO O
  174.  
  175. NXT     LDA     #$F8
  176.         STA     PORTB
  177. *
  178. *
  179. *       LOOP FOR APPROX. 8 SECONDS
  180. *
  181.         LDX     #$FF            GET COUNT
  182.         JSR     TMDLY           DELAY
  183. *
  184. *       CLOSE LOCK
  185. *
  186.         CLRA
  187.         STA     PORTB
  188.         JMP     BEGIN
  189. *
  190. *       THIS IS THE ALARM SPOT
  191. *
  192.  
  193. ALARM1  INC     CTRL            INCREMENT ALARM COUN
  194.         BRCLR   1,CTRL,NXT2     CHECK FOR ALARM =2
  195.         BSET    2,PORTB         IF ALARM=2, THEN SET
  196.  
  197. NXT2    JMP     BEGIN           GOTO START
  198. *
  199. *
  200. *       THIS IS THE SUBROUTINE GET8
  201. *
  202.  
  203.  
  204.  
  205. GET8    LDA     #$08            GET NUMBER COUNT
  206.         STA     TEMP1           SAVE COUNTER
  207. SCAN2   LDA     #$40            GET UPPER COUNTER
  208.         STA     TEMP2           SAVE COUNTER
  209. SCAN1   LDA     #$FF            GET LOWER COUNTER
  210.         STA     TEMP            SAVE COUNTER
  211. *
  212. *
  213. ****************************************************
  214. *       THIS SUBROUTINE SCANS A 4 x 3 MATRIX OF KEYS
  215. * VALUE OF 1-12 IN THE A ACCUMULATOR IF IT FINDS ONE
  216. * OTHERWISE IT RETURNS A VALUE OF $FF IF NO KEY IS D
  217. * ONLY REGISTER DESTROYED IS THE A ACCUMULATOR ALL O
  218. * ARE LEFT ALONE.                                   
  219. ****************************************************
  220. *
  221. SCAN    EQU     $
  222.         LDA     #$40
  223.         STA     PORTA           SELECT ONE COLUMN AT
  224.         STX     TEMPX           SAVE X REGISTER
  225.         LDX     #$03            COUNT THE COLUMN
  226. *
  227. LOOPA   LDA     PORTA           CHECK IF KEY PRESSED
  228.         AND     #$0F            CLEAR UPPER NIBBLE
  229.         BNE     DEBNCE          BRANCH IF KEY PRESSE
  230. NOKEY   LSR     PORTA           NEXT COLUMN
  231.         DECX                    DECREMENT COLUMN COU
  232.         BNE     LOOPA           NO KEY PRESSED
  233.         DECX                    RETURN X WITH $FF
  234. *
  235. EXIT    TXA
  236.         LDX     TEMPX
  237.         BRA     CK
  238. *
  239. *
  240. FOUND   LSRA                    SHIFT IF THE ROW INF
  241.         BCS     CHECK
  242.         INCX                    ADD 3 FOR EVERY ROW
  243.         INCX
  244.         INCX
  245.         BRA     FOUND
  246. *
  247.  
  248. CHECK   CPX     #$0A
  249.         BLO     EXIT            NUMBER RETURNED <10
  250.         CPX     #$0B
  251.         BEQ     FIX             INPUT NUMBER IS ZERO
  252. INVAL   LDX     #$FF            INVALID ENTRY RETURN
  253.         BRA     EXIT
  254.  
  255. FIX     LDX     #$00            RETURN 0 IN X
  256.         BRA     EXIT
  257. *
  258.  
  259. DEBNCE  STA     TEMPA           SAVE A REGISTER
  260.         CLR     VALID1
  261.         CLR     VALID2
  262. DBNCE1  LSRA
  263.         BCS     ONEKEY          CHECK TO MAKE SURE O
  264.         INC     VALID1
  265.         BRA     DBNCE1          CONTINUE CHECK
  266.  
  267. ONEKEY  CMP     #$00            ONLY ONE KEY PRESSED
  268.         BNE     INVAL           NO, MORE THAN ONE KE
  269. *
  270.         STX     TEMP3
  271.         LDX     #$FF
  272. MOR10   DECX
  273.         BNE     MOR10
  274.         LDX     TEMP3
  275. *
  276.         LDA     PORTA           CHECK TO MAKE SURE O
  277.         AND     #$0F
  278. ROWCK1  LSRA
  279.         BCS     ONEKY1
  280.         INC     VALID2
  281.         BRA     ROWCK1
  282.  
  283. ONEKY1  LDA     VALID2
  284.         CMP     VALID1          SAME KEY PRESSED
  285.         BNE     INVAL           NO! SAME KEY NOT PRE
  286. *
  287. *
  288. UPKEY   LDA     PORTA           CHECK TO MAKE SURE K
  289.         AND     #$0F
  290.         BNE     UPKEY           RELEASED? NO
  291.         LDA     TEMPA           VALID KEY PRESS
  292.         BRA     FOUND           CALCULATE KEY NUMBER
  293. *
  294. *
  295.  
  296. CK      INCA                    INCREMENT A Z=1=NOKE
  297.         BNE     BACK            GO BACK IF NOT ZERO
  298.         STX     TEMPX           SAVE X
  299.         LDX     #$01
  300.         BSR     TMDLY           DELAY FOR 32MS
  301.         LDX     TEMPX           GET X
  302.         DEC     TEMP            DEC LOWER COUNTER
  303.         BNE     SCAN            CHECK FOR MORE KEYS
  304.         DEC     TEMP2           DEC UPPER COUNTER
  305.         BNE     SCAN1           CHECK FOR MORE KEYS
  306. *
  307. *       CLEAR DISPLAY HERE
  308. *
  309. BCK     JSR     CLEAR
  310.         RSP
  311.         JMP     BEGIN
  312.  
  313. BACK    DECA                    ADJUST KEY NUMBER
  314.         STA     ,X              SAVE NUMBER
  315.         LDA     #DASH
  316.         BSR     DSPLY
  317.         INCX                    INC POINTER
  318.         DEC     TEMP1           DEC COUNTER
  319.         BNE     SC1             IF NOT 8 GET MORE
  320.         RTS                     RETURN
  321.  
  322. SC1     JMP     SCAN2
  323. *
  324. *       THIS IS THE DISPLAY SUBROUTINE
  325. *
  326.  
  327.  
  328.  
  329.  
  330. DSPLY   STX     TEMPX           SAVE X
  331.         LDX     #$08            GET COUNTER
  332.         CLC                     CLEAR CARRY
  333. MOR8    LSLA                    ROTATE TO GET BIT
  334.         BLO     ONE             ONE OR A ZERO
  335.         BCLR    0,PORTB         SEND ZERO
  336.         BRA     STRB
  337.  
  338. ONE     BSET    0,PORTB         SEND ONE
  339.  
  340. STRB    BSET    1,PORTB         SEND STROBE
  341.         BCLR    1,PORTB         TO ENTER DATA
  342.         DECX                    DEC COUNTER
  343.         BNE     MOR8
  344.         LDX     TEMPX
  345.         RTS                     RETURN
  346. *
  347.  
  348.  
  349.  
  350.  
  351. CLEAR   CLRA
  352.         LDX     #$08
  353. LOO     BSR     DSPLY
  354.         DECX
  355.         BNE     LOO
  356.         RTS
  357. *
  358. *       THIS IS THE BLOCK COMPARE ROUTINE
  359. *
  360. *       X-CONTAINS THE LOWER ORDER LOCATION
  361. *       THIS ROUTINE ASSUMES THE ONE TO EIGHT
  362. *       DIGIT NUMBERS ARE NEXT TO EACH OTHER
  363. *
  364.  
  365.  
  366. BLCMP   LDA     #$08            GET COUNTER
  367.         STA     TEMPA1          SAVE COUNTER
  368. MOR1    LDA     ,X              GET IT
  369.         CMP     #$08,X          COMPARE
  370.         BNE     RT              IF NO COMPARE GO BAC
  371.         INCX
  372.         DEC     TEMPA1          DEC COUNTER
  373.         BNE     MOR1            IF NOT DONE DO MORE
  374.         CLRA                    GET ALL ZEROS
  375.         BRA     RT1
  376.  
  377. RT      CLRA
  378.         COMA                    GET ALL ONES
  379.  
  380. RT1     RTS                     RETURN 00=EQUAL FF=N
  381. *
  382. *
  383. *       THIS IS THE TIME DELAY ROUTINE
  384. *
  385. *       X CONTAINS THE NUMBER OF TIME-OUTS THAT THE
  386. *       COUNTER WILL GO THRU
  387. *       ONE TIMEOUT=32 MILLISEC.
  388. *
  389.  
  390.  
  391. TMDLY   STA     TEMPA1          SAVEACC.
  392. MOR     LDA     #$47            GET TIMER CONTROL BY
  393.         STA     TIMER+1         STORE
  394.         LDA     #$FF            GET ALL ONES
  395.         STA     TIMER           STORE
  396. HERE    BRCLR   7,TIMER+1,HERE  POLL TIMER IRQ BIT F
  397.         DECX                    DEC COUNTER
  398.         BNE     MOR             IF NOT DONE DO MORE
  399.         RTS                     RETURN
  400. *
  401. *
  402. *       THIS IS THE IRQ DRIVER TO GET THE WHOLE THIN
  403. *
  404. INT     RSP
  405.         CLI
  406.         JMP     BGIN1
  407. *
  408. *
  409. *       SET UP EXTERNAL INTERRUPT VECTOR HERE
  410. *
  411. ****************************************************
  412. *
  413. *       VECTORS
  414. *
  415. ****************************************************
  416. *
  417.         ORG     MEMSIZ-10
  418.         FDB     BGIN1
  419.         FDB     BGIN1
  420.         FDB     INT
  421.         FDB     MONIT           SWI
  422.         FDB     RESET
  423.  
  424.